package br.com.site.usuario.dao;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.site.dao.DAOGenericoImpl;
import br.com.site.model.Usuario;

@Repository
public class UsuarioDAOImpl extends DAOGenericoImpl<Usuario, Long> implements
		UsuarioDAO {

	private static Log LOG = LogFactory.getLog(UsuarioDAOImpl.class);

	@Transactional(readOnly = true)
	public List<Usuario> listarTodos() {
		return listar();
	}

	@Transactional(readOnly = true)
	public Usuario buscarPorId(Long id) {
		return findPorId(id);
	}

	@Transactional
	public Long save(Usuario usuario) {
		return super.save(usuario);
	}

	@Transactional
	public boolean saveOrUpdate(Usuario usuario) {
		return super.saveOrUpdate(usuario);
	}

	@Transactional
	public boolean merge(Usuario usuario) {
		return super.merge(usuario);
	}

	@Transactional
	public boolean update(Usuario usuario) {
		return super.update(usuario);
	}

	@Transactional
	public boolean delete(Usuario usuario) {
		return super.delete(usuario);
	}

	@Transactional(readOnly = true)
	public Usuario logar(Usuario usuario) {

		try {
			String sql = "from Usuario u where u.login = :login and u.senha = :senha";
			Query query = getSessionFactory().openSession().createQuery(sql);
			query.setParameter("login", usuario.getLogin());
			query.setParameter("senha", usuario.getSenha());
			return (Usuario) query.uniqueResult();
		} catch (Exception e) {
			UsuarioDAOImpl.LOG.error(e);
			throw new HibernateException(e);
		}
	}
}
